package main

import "fmt"

// ----- 抽象层----

type Phone interface {
	Show() //构建的功能
}

// 抽象的装饰器 装饰器的基础类（该类应该是interface,
// 但是go的语法的interface 语法不可以有成员属性

type Decorator struct {
	phone Phone //组合进来抽象的phone
}

func (d *Decorator) Show() {}

// ------实现层------
// 具体的构建

type Huawei struct {
}

func (hw *Huawei) Show() {
	fmt.Println("秀出了HuaWei手机...")
}

type Xiaomi struct {
}

func (xm *Xiaomi) Show() {
	fmt.Println("秀出了xiaomi手机...")
}

// 具体的 装饰器
// 贴膜的装饰器

type MoDecorator struct {
	Decorator //继承基础的装饰器类 (主要继承Phone的)
}

func (md *MoDecorator) Show() {
	md.phone.Show() //调用被装饰的构件方法
	// ++++
	fmt.Println("贴膜的手机") // 装饰器额外装饰的功能
}

func NewMoDecorator(phone Phone) Phone {
	return &MoDecorator{Decorator{phone: phone}}
}

// 壳的装饰器

type KeDecorator struct {
	Decorator //继承基础的装饰器类 (主要继承Phone的)
}

func (md *KeDecorator) Show() {
	md.phone.Show() //调用被装饰的构件方法
	// ++++
	fmt.Println("贴膜的手机") // 装饰器额外装饰的功能
}

func NewKeDecorator(phone Phone) Phone {
	return &MoDecorator{Decorator{phone: phone}}
}

func main() {
	var huawei Phone
	huawei = new(Huawei)
	huawei.Show()

	//对华为手机进行装饰
	var moHuawei Phone
	moHuawei = NewMoDecorator(huawei)
	moHuawei.Show()

	// 对华为手机加手机壳
	var keHuawei Phone
	keHuawei = NewKeDecorator(huawei)
	keHuawei.Show()
}
